<?php

namespace App\Comment;

use DB;

class Comment
{
	/**
     * 检查权限
     * @param name string|array  需要验证的规则列表,支持逗号分隔的权限规则或索引数组
     * @param uid  int           认证用户的id
     * @param string mode        执行check的模式
     * @param relation string    如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
     * @return boolean           通过验证返回true;失败返回false
     */
 	public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or')
    {
        $authList = $this->getAuthList($uid, $type); //获取用户需要验证的所有有效规则列表
        
        if (is_string($name)) {
            $name = strtolower($name);
            if (strpos($name, ',') !== false) {
                $name = explode(',', $name);
				
            } else {
                $name = array($name);
				
            }
        }
		// dd($_REQUEST);
        $list = array(); //保存验证通过的规则名
        foreach ($authList as $auth) {
            if (in_array($auth, $name)) {
                $list[] = $auth;
            }
        }
        if ('or' == $relation and !empty($list)) {
            return true;
        }
        $diff = array_diff($name, $list);
        if ('and' == $relation and empty($diff)) {
            return true;
        }
        return false;
    }

    /**
     * 获得权限列表
     * @param integer $uid  用户id
     * @param integer $type
     */
    protected function getAuthList($uid, $type)
    {
        static $_authList = array(); //保存用户验证通过的权限列表
        $t                = implode(',', (array) $type);
		
        if (isset($_authList[$uid . $t])) {
            return $_authList[$uid . $t];
        }
 
        //读取用户所属用户组
        $groups = $this->getGroups($uid);
		
        $ids    = array(); //保存用户所属用户组设置的所有权限规则id


        $ids = array_unique(explode(',',$groups['rules']));
        if (empty($ids)) {
            $_authList[$uid . $t] = array();
            return array();
        }
		//循环规则，判断结果。
        $authList = array();
        //读取用户组所有权限规则
        $rules = DB::table('admin_rules')->where('status',1)->whereIn('id', $ids)->pluck('name')->toArray();

        foreach ($rules as $rule) {
            //只要存在就记录
            $authList[] = strtolower($rule);
        }

        $_authList[$uid . $t] = $authList;

        return array_unique($authList);
    }
    /**
     * 根据用户id获取用户组,返回值为数组
     * @param  uid int     用户id
     * @return array       用户所属的用户组 array(
     *     array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),
     *     ...)
     */
    public function getGroups($uid)
    {
        static $groups = array();
        if (isset($groups[$uid])) {
            return $groups[$uid];
        }
        $user_groups = DB::table('admin_user as u')->leftJoin('admin_group as g','u.groupid','=','g.id')->where('u.id','=',$uid)->where('g.status','=',1)->select('u.id','u.groupid','g.title','g.rules')->first();
        $user_groups = json_decode(json_encode($user_groups),true);
        // dd($user_groups);
        $groups[$uid] = $user_groups ?: array();
        return $groups[$uid];
    }
}